home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 13316 / 13316.xpi / content / historySearch.js < prev    next >
Text File  |  2009-07-27  |  12KB  |  403 lines

  1.  
  2. /* Copyright (C) 2009 Norman Solomon
  3.  * e-mail: historytree.addon@yahoo.com
  4.  * 
  5.  * The contents of this file are subject to the Mozilla Public License Version
  6.  * 1.1 (the "License"); you may not use this file except in compliance with
  7.  * the License. You may obtain a copy of the License at http://www.mozilla.org/MPL/
  8.  *
  9.  * Software distributed under the License is distributed on an "AS IS" basis,
  10.  * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
  11.  * for the specific language governing rights and limitations under the License.
  12.  */
  13.  
  14. // ***********************************************************************
  15. // *****                                                             *****
  16. // *****        WEB-PAGE DESCRIPTION AND URL SEARCH FUNCTIONS        *****
  17. // *****   -------------------------------------------------------   *****
  18. // *****     Creates search array, searches and displays results     *****
  19. // *****   Functions called from "historyViewer.xul" EventHandlers   *****
  20. // *****                                                             *****
  21. // ***********************************************************************
  22.  
  23. // ============================================================
  24. // Called from <image...> onclick() event handlers. BUT make
  25. // sure txtToFind exists BEFORE calling (else inifinite loop)
  26. // ============================================================
  27. function searchTree(findNext, txtToFind, searchURL)
  28. {
  29.     // Init vars
  30.     var btnFindNext;    // <image...> button
  31.     var btnFindPrev;    // <image...> button
  32.     var hNodeNdx;        // Integer
  33.     var hNode;            // HistoryNode
  34.     var tNode;            // TreeNode
  35.     var matchFound;        // boolean
  36.  
  37.     // ----------------------------------------
  38.     // Stop setTimout() and set global flag
  39.     clearTimeout(gTimeoutInterval);
  40.     gTimeoutInterval = null;
  41.  
  42.     // Set search button image to button-out 
  43.     if (findNext)
  44.     {
  45.         btnFindNext = document.getElementById("btnFindNext");
  46.         btnFindNext.src = "images/btnNextOut.gif";
  47.     }
  48.     else
  49.     {
  50.         btnFindPrev = document.getElementById("btnFindPrev");
  51.         btnFindPrev.src = "images/btnPrevOut.gif";
  52.     }
  53.     
  54.     // ------------------------------------------
  55.     // Clear currently highlighted node (if any)
  56.     if (gSearchNdx >= 0)
  57.     {
  58.         hNodeNdx = gSearchIndexes[gSearchNdx];
  59.         hNode = gNodeList[hNodeNdx];
  60.         tNode = gTreeNodes[hNode.treeNodeNdx + 1];
  61.         if (!tNode.hidden)
  62.         {
  63.             // Clear highlighted node depending on view
  64.             if (gCurrentView === TREE_VIEW)
  65.             {
  66.                 // Draw TV node box and the text inside it
  67.                 drawNodeBoxWithTextInside(tNode, false);
  68.             }
  69.             else
  70.             {
  71.                 // Draw GV image and description
  72.                 drawGridViewImage(tNode, false);
  73.                 drawGridViewDescription(tNode, false);
  74.             }
  75.         }
  76.     }
  77.  
  78.     // -----------------------------------------------
  79.     // Do "loop-around" search from current gSearchNdx
  80.     matchFound = false;
  81.     while (!matchFound)
  82.     {
  83.         // Set Next/Prev "loop-around" gSearchNdx
  84.         if (findNext)
  85.         {
  86.             gSearchNdx ++;
  87.             if (gSearchNdx >= gSearchIndexes.length)
  88.                 gSearchNdx = 0;
  89.         }
  90.         else
  91.         {
  92.             gSearchNdx --;
  93.             if (gSearchNdx < 0)
  94.                 gSearchNdx = gSearchIndexes.length - 1;
  95.         }
  96.  
  97.         // Get hNode using gSearchNdx pointer
  98.         hNodeNdx = gSearchIndexes[gSearchNdx];
  99.         hNode = gNodeList[hNodeNdx];
  100.  
  101.         // Search web-page description for passed txtToFind
  102.         if (hNode.uCaseDesc.indexOf(txtToFind) !== -1)
  103.         {
  104.             matchFound = true;
  105.         }
  106.         else if (searchURL)
  107.         {
  108.             // Search web-page URL for passed txtToFind
  109.             if (hNode.uCaseUri.indexOf(txtToFind) !== -1)
  110.                 matchFound = true;
  111.         }
  112.     }
  113.  
  114.     // --------------------------------------------------
  115.     // Scroll to, display and highlight the found hNode 
  116.     highlightGVorTVnode(hNode);
  117. }
  118.  
  119. // ======================================================
  120. // Scrolls to, displays and highlights the passed hNode 
  121. // Highlights GV or TV nodes found via Find Next/Prev
  122. // ======================================================
  123. function highlightGVorTVnode(hNode)
  124. {
  125.     // Init vars
  126.     var tNode;          // TreeNode
  127.     var optGrpView;      // <radiogroup...>
  128.     var sldDraw;      // <scale...>
  129.     var numAcross;      // Integer
  130.  
  131.     // --------------------------------------------------
  132.     // Get corresponding TreeNode from gTreeNodes[]
  133.     tNode = gTreeNodes[hNode.treeNodeNdx + 1];
  134.  
  135.     // Process differs for visible and invisible nodes
  136.     if (!tNode.hidden)
  137.     {
  138.         // Scroll visible tNode into view (for GV and TV)
  139.         scrollNodeIntoView(tNode);
  140.  
  141.         // Highlight node depending on view
  142.         if (gCurrentView === TREE_VIEW)
  143.         {
  144.             // If an expanded image is currently visible clear it
  145.             if (gExpandedNode !== null)
  146.             {
  147.                 drawTree(false, null, null);
  148.                 gExpandedNode = null;
  149.             }
  150.             else
  151.             {
  152.                 // Draw TV node box and the text inside it
  153.                 drawNodeBoxWithTextInside(tNode, true);
  154.             }
  155.         }
  156.         else
  157.         {
  158.             // Draw GV image and description
  159.             drawGridViewImage(tNode, true);
  160.             drawGridViewDescription(tNode, true);
  161.         }
  162.     }
  163.     else
  164.     {
  165.         // tNode is hidden - Expand all sub-trees for current quick-view
  166.         optGrpView = document.getElementById("optGrpView");
  167.         setTreeNodePointersForSelectedQuickView(optGrpView.selectedIndex);
  168.         
  169.         // If tNode is STILL hidden change to required quick-view
  170.         if (tNode.hidden)
  171.         {
  172.             if (isOpenTab(hNode.tab))
  173.             {
  174.                 // Hidden found tNode is in an open FF Tab
  175.                 optGrpView.selectedIndex = 0;
  176.                 setTreePointersFor_OpenTabsQuickView();
  177.             }
  178.             else
  179.             {
  180.                 // Hidden found tNode is in a closed FF Tab
  181.                 optGrpView.selectedIndex = 3;
  182.                 setTreePointersFor_ClosedTabsQuickView();
  183.             }
  184.         }
  185.  
  186.         // Draw req GV or TV quick-view on gCanvas
  187.         if (gCurrentView === TREE_VIEW)
  188.         {
  189.             // Draw TV with found tNode highlighted, where
  190.             // scrolling tNode into view is done in drawTree()
  191.             drawTree(false, null, tNode);
  192.         }
  193.         else
  194.         {
  195.             // Draw GV quick-view using req number of images per row
  196.             sldDraw = document.getElementById("sldDraw");
  197.             numAcross = (sldDraw.max - sldDraw.value) + 3;
  198.             drawAllImagesOnCanvas(numAcross, true);
  199.  
  200.             // GV tNode(x,y) is set - So can scroll it into view
  201.             scrollNodeIntoView(tNode);
  202.         }
  203.     }
  204. }
  205.  
  206. // =============================================================
  207. // Creates gSearchIndexes[] - Enabling consistant search order
  208. // =============================================================
  209. function createGlobalSearchIndexesArray()
  210. {
  211.     // Init vars
  212.     var tabRoot, tNode;     // TreeNode's
  213.     var tabID;             // FF Tab tabID
  214.     var addOpenPage;     // Boolean
  215.     var hNode;             // HistoryNode
  216.     
  217.     // -----------------------------------------------------
  218.     // Indexes are added Tab-by-Tab, in FF Tab display order
  219.     for (var i = 0; i < gTabRoots.length; i++)
  220.     {
  221.         tabRoot = gTabRoots[i];
  222.         tabID = tabRoot.histNode.tab;
  223.  
  224.         // Add indexes for this Tab in the order they were added
  225.         // to gNodeList[] - open pages first, then closed pages
  226.         for (var tf = 0; tf < 2; tf++)
  227.         {
  228.             // Set flag used in for(j) loop, below
  229.             if (tf === 0)
  230.                 addOpenPage = true;
  231.             else
  232.                 addOpenPage = false;
  233.             
  234.             // Two passes down gNodeList[] are made for each tabID
  235.             for (var j = 0; j < gNodeList.length; j++)
  236.             {
  237.                 // Add index for open or closed page
  238.                 hNode = gNodeList[j];
  239.                 tNode = gTreeNodes[hNode.treeNodeNdx + 1]; // + 1 for added Root
  240.                 if (hNode.tab === tabID && tNode.isOpenPage === addOpenPage)
  241.                 {
  242.                     // Add gNodeList[] index to global search array
  243.                     gSearchIndexes.push(j);
  244.                 }
  245.             }
  246.         }
  247.     }
  248. }
  249.  
  250. // ============================================================
  251. // Returns true if <textbox...> text is found in gNodeList[]
  252. // Both the desc AND the URL are searched if searchURL = true
  253. // ============================================================
  254. function searchTextFound(txtToFind, searchURL)
  255. {
  256.     // Init vars
  257.     var hNodeNdx;
  258.     var hNode;
  259.  
  260.     // --------------------------------------------------
  261.     // Search for matching web-page description and URL
  262.     for (var i = 0; i < gSearchIndexes.length; i++)
  263.     {
  264.         // Get hNode using gSearchIndexes[] pointer
  265.         hNodeNdx = gSearchIndexes[i];
  266.         hNode = gNodeList[hNodeNdx];
  267.  
  268.         // Search web-page description for passed txtToFind
  269.         if (hNode.uCaseDesc.indexOf(txtToFind) !== -1)
  270.         {
  271.             return true;
  272.         }
  273.         else if (searchURL)
  274.         {
  275.             // Search web-page URL for passed txtToFind
  276.             if (hNode.uCaseUri.indexOf(txtToFind) !== -1)
  277.                 return true;
  278.         }
  279.     }
  280.  
  281.     // Search text was not found in desc or URL
  282.     return false;
  283. }
  284.  
  285. // =========================================================
  286. // Scrolls gCanvas so that found hNode is visible on screen
  287. // Takes account of current window size and gCurrentView
  288. // =========================================================
  289. function scrollNodeIntoView(tNode)
  290. {
  291.     // Init integer vars
  292.     var xChange, yChange;
  293.     var wx, wy, ww, wh, wb, wr;
  294.     var nx, ny, nw, nh, nb, nr;
  295.  
  296.     // Init objects
  297.     var xs = {};
  298.     var ys = {};
  299.     var tNode;
  300.  
  301.     // ---------------------------------------------
  302.     // Get this window's wx, wy, ww, wh, wb, wr
  303.     gCanvasScroller.getPosition(xs, ys);
  304.     wx = xs.value;
  305.     wy = ys.value;
  306.     ww = this.innerWidth;
  307.     wh = this.innerHeight - gCanvas.offsetTop;
  308.     wb = wy + wh;
  309.     wr = wx + ww;
  310.  
  311.     // Get TreeNode's nx, ny, nw, nh, nb, nr
  312.     if (gCurrentView === TREE_VIEW)
  313.     {
  314.         nx = tNode.pos.x;
  315.         ny = tNode.pos.y;
  316.         nw = tNode.width;
  317.         nh = tNode.height + BOX_BTN_HGT;
  318.         nb = ny + nh;
  319.         nr = nx + nw;
  320.     }
  321.     else
  322.     {
  323.         nx = tNode.gridViewImgX;
  324.         ny = tNode.gridViewImgY;
  325.         nw = tNode.gridViewImgWid;
  326.         nh = Math.round(nw * WH_RATIO) + GV_VGAP;
  327.         nb = ny + nh;
  328.         nr = nx + nw;
  329.     }
  330.     
  331.     // ---------------------------------------------
  332.     // Calculate scrollBy(x) using above values 
  333.     if (nr < ww)
  334.         xChange = wx * (-1); // Scroll to zero x
  335.     else if (nr > wr)
  336.         xChange = nr - wr;     // Scroll right
  337.     else if (nx < wx)
  338.         xChange = nx - wx;     // Scroll left
  339.     else
  340.         xChange = 0;
  341.     
  342.     // Calculate scrollBy(y) using above values 
  343.     if (nb < wh)
  344.         yChange = wy * (-1); // Scroll to zero y
  345.     else if (nb > wb)
  346.         yChange = nb - wb;     // Scroll down
  347.     else if (ny < wy)
  348.         yChange = ny - wy;     // Scroll up
  349.     else
  350.         yChange = 0;
  351.  
  352.     // Adjust for better TV or GV appearance
  353.     if (gCurrentView === TREE_VIEW)
  354.     {
  355.         if (xChange < 0) xChange -= 30;
  356.         if (xChange > 0) xChange += 30;
  357.         if (yChange < 0) yChange -= 20;
  358.         if (yChange > 0) yChange += 20;
  359.     }
  360.     else
  361.     {
  362.         if (yChange < 0) yChange -= 15;
  363.     }
  364.  
  365.     // Scroll TreeNode into view
  366.     gCanvasScroller.scrollBy(xChange, yChange);
  367. }
  368.  
  369. // =================================================================
  370. // Sets search <textbox...> background red if search text NOT found
  371. // =================================================================
  372. function setSearchTextBoxColor(searchURL)
  373. {
  374.     // Get text to search for from <textbox...>
  375.     var txtFind = document.getElementById("txtFind");
  376.     var txtToFind = (txtFind.value).toUpperCase();
  377.     
  378.     // ---------------------------------------------------
  379.     // Make <textbox...> background red if text NOT found
  380.     if (gNodeList.length === 0)
  381.         txtFind.style.backgroundColor = "#cccccc";    // Grey
  382.     else if (txtToFind === "" || searchTextFound(txtToFind, searchURL))
  383.         txtFind.style.backgroundColor = "#ffffff";    // White
  384.     else
  385.         txtFind.style.backgroundColor = "#ff9090";    // Red
  386. }
  387.  
  388. // =========================================================
  389. // Returns true if tNode was highlighted via Find Next/Prev
  390. // =========================================================
  391. function isHighlightedNode(tNode)
  392. {
  393.     var hNodeNdx;
  394.     var hNode;
  395.     if (gSearchNdx >= 0)
  396.     {
  397.         hNodeNdx = gSearchIndexes[gSearchNdx];
  398.         hNode = gNodeList[hNodeNdx];
  399.         if (tNode.histNode === hNode)
  400.             return true;
  401.     }
  402.     return false;
  403. }